package com.laich.springcloud.security.conf;

import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author laich
 * @date 2019-03-19
 */
@EnableOAuth2Sso
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    	// http.logout()默认的退出api, 默认的退出的url地址是/logout 这个是spring security安全框架做好了的
        http.logout().logoutSuccessUrl("http://localhost:8080/logout");//logou指向这里
        http.authorizeRequests().anyRequest().authenticated();
        //通过调用authorizeRequests()和 anyRequest().authenticated()就会要求所有进入应用的HTTP请求都要进行认证。
        //也就是说所有请求都会到server端认证
        http.csrf().disable();
        /**
         * .antMatchers("/shop/hello").authenticated()
                .antMatchers(HttpMethod.POST,"/shop/order").authenticated()
                意思是：我们只是配置了 “/shop/hello” 和 “/shop/order” 这两个路径必须进过认证,并且 “/shop/order” 必须是 post 请求的方式.
                对于其他的请求, .anyRequest().permitAll() ;都放行.
     antMatchers()方法所使用的路径可能会包括Ant风格的通配符，而regexMatchers()方法则能够接受正则表达式来定义请求路径。           
                
                 上面的意思很重要
         access(String) 如果给定的SpEL表达式计算结果为true，就允许访问
		anonymous() 允许匿名用户访问
		authenticated() 允许认证的用户进行访问
		denyAll() 无条件拒绝所有访问
		fullyAuthenticated() 如果用户是完整认证的话（不是通过Remember-me功能认证的），就允许访问
		hasAuthority(String) 如果用户具备给定权限的话就允许访问
		hasAnyAuthority(String…)如果用户具备给定权限中的某一个的话，就允许访问
		hasRole(String) 如果用户具备给定角色(用户组)的话,就允许访问/
		hasAnyRole(String…) 如果用户具有给定角色(用户组)中的一个的话,允许访问.
		hasIpAddress(String 如果请求来自给定ip地址的话,就允许访问.
		not() 对其他访问结果求反.
		permitAll() 无条件允许访问
		rememberMe() 如果用户是通过Remember-me功能认证的，就允许访问
         */
    }
}
